home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / dvidjc / turbo-c / dvivgac.c < prev    next >
C/C++ Source or Header  |  1994-03-06  |  48KB  |  1,232 lines

  1. /* This is the color TeX previewer DVIVGA */
  2. /* (C)opyright 1994 Wolfgang R. Mueller, Computing Centre,
  3. Heinrich-Heine-University Duesseldorf, Germany,
  4. wolfgang@uni-duesseldorf.de, +49-211-311-3905.
  5. This program may be used without any warranty under
  6. the terms of the GNU general public licence. */
  7. /* translated from the original TurboPascal source
  8. partly with p2c, the Pascal-to-C translator */
  9.  
  10. #include <stdio.h>
  11. #ifdef __TURBOC__
  12.   #include <mem.h>
  13.   #include <alloc.h>
  14.   #define malloc farmalloc
  15.   #define calloc farcalloc
  16.   #define realloc farrealloc
  17.   #define free farfree
  18. #endif
  19.  
  20. #define uchar unsigned char
  21. #define ushort unsigned short
  22. #define ulong unsigned long
  23. #define ptr void *
  24.  
  25. #define maxink     16
  26. #define inkshift    4  /* maxink == 1<<inkshift */
  27. #define smax      100
  28. #define xm       319
  29. #define ym        447
  30.  
  31. #ifdef __MSDOS__
  32. static char tfmprefix[] = "c:\\tex\\fonts\\tfm\\";
  33. static char fontprefix[] = "c:\\tex\\fonts\\canon\\";
  34. #else
  35. static char tfmprefix[] = "/usr/TeX/lib/tex/fonts/";
  36. static char fontprefix[] = "/usr/TeX/lib/tex/fonts/";
  37. #endif
  38.  
  39. static uchar maskmat[5][4] = {
  40.   {14,4,16,2},{7,9,5,11},{15,1,13,3},{6,12,8,10},{0x88,0x44,0x22,0x11}};
  41. typedef struct greydesc { uchar maskc, maskm, masky; } greydesc;
  42.  
  43. static uchar stackcy[smax], stackma[smax], stackye[smax], stackbl[smax];
  44. static char STR[99], FOPRE[99], FOMAG[16], FONAM[99], FOLOC[99], FOFUL[99];
  45. static greydesc greymask[8];
  46. static uchar maskb[maxink + 1][4];
  47. static uchar cb[256], *pxlmem[ym+1];
  48.  
  49. static uchar alles, clearing, fini;
  50. static short colst, xres=300, yres=300, xmax, hoff, voff;
  51. static ushort darkfac;
  52. static short xmb, ymax, hoffa=0, voffa=0;
  53. static ulong zoelli;
  54. static FILE *prot=stderr;
  55.  
  56. static void finale();
  57. static void Tptr(p) void *p; {  if(p==NULL) {
  58.   fprintf(prot, " - not enough memory :-( ");  finale();
  59.   } /* else fprintf(prot, "(free:%ld)", (long)coreleft());*/
  60. }
  61. static void initpxmem() {  short i;
  62.   for (i = 0; i <= ym; i++)  Tptr(pxlmem[i] = (uchar *)malloc(xm + 1));
  63. }
  64. static void clrpxlmem() {  short i;
  65.   for (i = 0; i <= ym; i++)  memset(pxlmem[i], 0, xm + 1);
  66. }
  67. static void pixet(y, x, b)  ushort y, x;  uchar b;  {
  68.   uchar *wo;  greydesc *WITH1;
  69.   wo = pxlmem[y] + x;  WITH1 = &greymask[y & 7];
  70.   if (clearing) * wo      &= ~b; else * wo      |= (b & WITH1->maskc);
  71.   if (clearing) *(wo +40) &= ~b; else *(wo +40) |= (b & WITH1->maskm);
  72.   if (clearing) *(wo +80) &= ~b; else *(wo +80) |= (b & WITH1->masky);
  73. }
  74. static void paxet(y, x, b)  ushort y, x;  uchar b;  {
  75.   uchar *wo = pxlmem[y] + x;
  76.   if (clearing)  *wo = (*wo * (64 - b)) >> 6;
  77.    else  *wo += ((ushort)b * darkfac) >> inkshift;
  78. }
  79. static ushort vertfac=7;
  80. static void verteil(x, w, y, h, xp, yp, zp)
  81.  ushort x, w, y, h, *xp, *yp, *zp;  {
  82.   ushort xp1, yp1, zp1, xp2, yp2, zp2, wh, tau;  ushort b;
  83.   if (w + h > 2) {
  84.     if (w > h) {  wh = w >> 1;
  85.       verteil(x, wh, y, h, &xp1, &yp1, &zp1);
  86.       verteil(x + wh, w - wh, y, h, &xp2, &yp2, &zp2);
  87.     } else {  wh = h >> 1;
  88.       verteil(x, w, y, wh, &xp1, &yp1, &zp1);
  89.       verteil(x, w, y + wh, h - wh, &xp2, &yp2, &zp2);
  90.     }
  91.     if (zp2 > zp1) {
  92.       tau = xp1;  xp1 = xp2;  xp2 = tau;  tau = yp1;  yp1 = yp2;  yp2 = tau;
  93.     }  *zp = zp1 + zp2;
  94.     if (*zp < 64) {  *xp = xp1;  *yp = yp1;  return;  }
  95.     pxlmem[xp1][yp1] += 1;  *zp -= 64;  *xp = xp2;  *yp = yp2;  return;
  96.   }
  97.   *xp = x;  *yp = y;  b = pxlmem[x][y]; if(b>64) b=64; b*=vertfac;
  98.   pxlmem[x][y] = b >> 6;  *zp = b & 63;
  99. }
  100. #ifdef __TURBOC__
  101. #include <conio.h>
  102. #include <dos.h>
  103. #include <bios.h>
  104. #define BIOI 0x10
  105. static uchar *vgamem=(uchar *)0xa0000000;
  106. static ushort savemode;
  107. static void dispinit()  {  uchar ret, *p;  short i;
  108.   _AX = 0x0f00; geninterrupt(BIOI); ret=_AL; savemode=ret;
  109.   _AX = 0x1a00; geninterrupt(BIOI); ret=_AL;
  110.   if(ret != 0x1a) { fprintf(prot, "Only VGA supported !\n"); exit(1); }
  111.   initpxmem(); vgamem+=80*(480-ym-1);
  112. }
  113. static void dispopen() {  ushort i;  uchar *p;
  114.   /*while(!kbhit()) ;*/
  115.   if (alles) {  xmax = xm * 8 + 7;  ymax = ym * 8 + 7;  }
  116.    else  {  xmb = xm >> 3;  xmax = xm;  ymax = ym;  }
  117.   clrpxlmem();  if (alles < 3) return;
  118.   _AX = 0x12; geninterrupt(BIOI);
  119.   _AX = 0x1000; _BX = 0x0000; geninterrupt(BIOI);
  120.   _AX = 0x1000; _BX = 0x0101; geninterrupt(BIOI);
  121.   _AX = 0x1000; _BX = 0x0202; geninterrupt(BIOI);
  122.   _AX = 0x1000; _BX = 0x0303; geninterrupt(BIOI);
  123.   _AX = 0x1000; _BX = 0x0404; geninterrupt(BIOI);
  124.   _AX = 0x1000; _BX = 0x0505; geninterrupt(BIOI);
  125.   _AX = 0x1000; _BX = 0x0606; geninterrupt(BIOI);
  126.   _AX = 0x1000; _BX = 0x0707; geninterrupt(BIOI);
  127.   _AX = 0x1000; _BX = 0x0708; geninterrupt(BIOI);
  128.   _AX = 0x1000; _BX = 0x0709; geninterrupt(BIOI);
  129.   _AX = 0x1000; _BX = 0x070a; geninterrupt(BIOI);
  130.   _AX = 0x1000; _BX = 0x070b; geninterrupt(BIOI);
  131.   _AX = 0x1000; _BX = 0x070c; geninterrupt(BIOI);
  132.   _AX = 0x1000; _BX = 0x070d; geninterrupt(BIOI);
  133.   _AX = 0x1000; _BX = 0x070e; geninterrupt(BIOI);
  134.   _AX = 0x1000; _BX = 0x070f; geninterrupt(BIOI);
  135.   if (vertfac == 7) {
  136.     _AX = 0x1010; _BX = 0x0000; _CX = 0x3f3f; _DH = 0x3f; geninterrupt(BIOI);
  137.     _AX = 0x1010; _BX = 0x0001; _CX = 0x3636; _DH = 0x36; geninterrupt(BIOI);
  138.     _AX = 0x1010; _BX = 0x0002; _CX = 0x2d2d; _DH = 0x2d; geninterrupt(BIOI);
  139.     _AX = 0x1010; _BX = 0x0003; _CX = 0x2424; _DH = 0x24; geninterrupt(BIOI);
  140.     _AX = 0x1010; _BX = 0x0004; _CX = 0x1b1b; _DH = 0x1b; geninterrupt(BIOI);
  141.     _AX = 0x1010; _BX = 0x0005; _CX = 0x1212; _DH = 0x12; geninterrupt(BIOI);
  142.     _AX = 0x1010; _BX = 0x0006; _CX = 0x0909; _DH = 0x09; geninterrupt(BIOI);
  143.     _AX = 0x1010; _BX = 0x0007; _CX = 0x0000; _DH = 0x00; geninterrupt(BIOI);
  144.   } else {
  145.     _AX = 0x1010; _BX = 0x0000; _CX = 0x3f3f; _DH = 0x3f; geninterrupt(BIOI);
  146.     _AX = 0x1010; _BX = 0x0001; _CX = 0x3f00; _DH = 0x3f; geninterrupt(BIOI);
  147.     _AX = 0x1010; _BX = 0x0002; _CX = 0x3f3f; _DH = 0x00; geninterrupt(BIOI);
  148.     _AX = 0x1010; _BX = 0x0003; _CX = 0x3f00; _DH = 0x00; geninterrupt(BIOI);
  149.     _AX = 0x1010; _BX = 0x0004; _CX = 0x003f; _DH = 0x3f; geninterrupt(BIOI);
  150.     _AX = 0x1010; _BX = 0x0005; _CX = 0x0000; _DH = 0x3f; geninterrupt(BIOI);
  151.     _AX = 0x1010; _BX = 0x0006; _CX = 0x003f; _DH = 0x00; geninterrupt(BIOI);
  152.     _AX = 0x1010; _BX = 0x0007; _CX = 0x0000; _DH = 0x00; geninterrupt(BIOI);
  153.   }  gotoxy(9,1);
  154.   printf("The HHU TeX colour Previewer (V 94.03) distributed by DANTE e.V.");
  155.   gotoxy(25,2);
  156.   printf("supporting \\special{color ...}");
  157.   outportb(0x3c4,2);  outportb(0x3c5,8);
  158.   for (i=0, p=vgamem+39; i<=ym; i++, p+=80)  *p=0x01;
  159.   memset(vgamem-80, 0xff, 80);
  160.   gotoxy(43,4);   printf("p(revious page) or backspace");
  161.   gotoxy(43,5);   printf("n(ext page) or enter or spacebar");
  162.   gotoxy(43,6);   printf("c(olour) g(rey)  q(uit)");
  163.   gotoxy(43,8);   printf("Moving Magnifying Glass");
  164.   gotoxy(43,10);  printf("l(eft) r(ight) u(p) d(own)");
  165.   gotoxy(43,11);  printf(" ALT-ed:    small stepsize");
  166.   gotoxy(43,12);  printf(" unshifted: medium stepsize");
  167.   gotoxy(43,13);  printf(" shifted:   large stepsize");
  168.   gotoxy(43,15);  printf("cursor keys give medium,");
  169.   gotoxy(43,16);  printf("CTRL+left/right arrow large,");
  170.   gotoxy(43,17);  printf("PGUP/PGDOWN large stepsize");
  171.   gotoxy(43,19);  printf("HOME upper left corner");
  172.   gotoxy(43,20);  printf("END lower right corner");
  173.   gotoxy(43,22);  printf("Any of those keys activates");
  174.   gotoxy(43,23);  printf("the magnifying glass here.");
  175. }
  176. static uchar shiftab[4]={1,2,4,4};
  177. static void dispcopy() {  ushort i, j, k;  uchar b, *p, *q, l;
  178.   if (alles)  {
  179.     if (vertfac == 7) {
  180.       alles = 0;
  181.       verteil(0, ym + 1, 0, xm + 1, &i, &j, &k);
  182.       for (l = 0; l < 3; l++) {
  183.     outportb(0x3c4,2); outportb(0x3c5,shiftab[l]);
  184.     for (j = 0; j <= ym; j++)  {  p = vgamem + j * 80;  q = pxlmem[j];
  185.       for (k = 0; k <= xm; k++) {
  186.         if ((k & 7) == 0)  b = (*q & 0x01);
  187.         else  {  b = (b << 1) | (*q & 0x01);
  188.           if ((k & 7) == 7)  *p++ = b;
  189.         } *q++ >>=1;
  190.       } } }
  191.     }  else  {  switch (alles)  {
  192.       case 3:  outportb(0x3c4,2);  outportb(0x3c5,2);  break;
  193.       case 2:  outportb(0x3c4,2);  outportb(0x3c5,4);  break;
  194.       case 1:  outportb(0x3c4,2);  outportb(0x3c5,1);  break;
  195.       }  alles--;
  196.       verteil(0, ym + 1, 0, xm + 1, &i, &j, &k);
  197.       for (j = 0; j <= ym; j++)  {  p = vgamem + j * 80;  q = pxlmem[j];
  198.     for (k = 0; k <= xm; k++) {
  199.       if ((k & 7) == 0)  b = *q++;
  200.       else  {  b = (b << 1) | *q++;
  201.         if ((k & 7) == 7)  *p++ = b;
  202.     } } } }
  203.   }  else  {  ushort x1,x2,x,y1,y2,y;
  204.     outportb(0x3ce,4); outportb(0x3cf,3);
  205.     outportb(0x3c4,2); outportb(0x3c5,8);
  206.     x1 = (hoffa + xres) >> 3;  x2 = x1 + (xm >> 3);
  207.     y1 = (voffa + yres) >> 3;  y2 = y1 + (ym >> 3);
  208.     for (x=x1; x<=x2; x++)  for (y=y1; y<=y2; y++)
  209.      if ((x==x1)||(x==x2)||(y==y1)||(y==y2))
  210.       vgamem[y*80+(x>>3)] &= 0xff7f >> (x & 7);
  211.     hoffa = hoff;  voffa = voff;
  212.     x1 = (hoffa + xres) >> 3;  x2 = x1 + (xm >> 3);
  213.     y1 = (voffa + yres) >> 3;  y2 = y1 + (ym >> 3);
  214.     for (x=x1; x<=x2; x++)  for (y=y1; y<=y2; y++)
  215.      if ((x==x1)||(x==x2)||(y==y1)||(y==y2))
  216.       vgamem[y*80+(x>>3)] |= 0x0080 >> (x & 7);
  217.     outportb(0x3c4,2); outportb(0x3c5,2);
  218.     for (j = 0, p = vgamem + 40; j <= ym; j++, p += 80)
  219.      memcpy(p, pxlmem[j]     , 40);
  220.     outportb(0x3c4,2); outportb(0x3c5,4);
  221.     for (j = 0, p = vgamem + 40; j <= ym; j++, p += 80)
  222.      memcpy(p, pxlmem[j] + 40, 40);
  223.     outportb(0x3c4,2); outportb(0x3c5,1);
  224.     for (j = 0, p = vgamem + 40; j <= ym; j++, p += 80)
  225.      memcpy(p, pxlmem[j] + 80, 40);
  226. } }
  227.  
  228. static void dispclos() { _AX = savemode; geninterrupt(BIOI);
  229. }
  230. static char evalkbd() {  char np=0;  while (! kbhit()) ;
  231.   hoff += xres;  voff += yres;
  232.   while (kbhit()) {
  233.     switch (getch()) {
  234.     case 'h': case 'H': hoff=0; voff=0; break;
  235.     case 'u': voff-=64; break;
  236.     case 'U': voff-=256; break;
  237.     case 'd': voff+=64; break;
  238.     case 'D': voff+=256; break;
  239.     case 'l': hoff-=64; break;
  240.     case 'L': hoff-=256; break;
  241.     case 'r': hoff+=64; break;
  242.     case 'R': hoff+=256; break;
  243.     case 'q': case 'Q': fini=1; break;
  244.     case 'n': case 'N': case 13: case ' ': np=1; break;
  245.     case 'p': case 'P': case  8: np=-1; break;
  246.     case 'c': vertfac=1; alles=3; break;
  247.     case 'g': vertfac=7; alles=3; break;
  248.     case 0: switch (getch()) {
  249.       case 19: hoff+=8; break;
  250.       case 22: voff-=8; break;
  251.       case 32: voff+=8; break;
  252.       case 38: hoff-=8; break;
  253.       case 71: hoff=0; voff=0; break;
  254.       case 72: voff-=64; break;
  255.       case 73: voff-=256; break;
  256.       case 75: hoff-=64; break;
  257.       case 77: hoff+=64; break;
  258.       case 79: hoff=xm << 3; voff=ym << 3; break;
  259.       case 80: voff+=64; break;
  260.       case 81: voff+=256; break;
  261.       case 115: hoff-=256; break;
  262.       case 116: hoff+=256; break;
  263.       } break;
  264.     }
  265.   }
  266.   if (hoff<0) hoff=0;  if (hoff>xm*7-1) hoff=xm*7-1;  hoff -= xres;
  267.   if (voff<0) voff=0;  if (voff>ym*7+7) voff=ym*7+7;  voff -= yres;
  268.   return(np);
  269. }
  270. #endif
  271. static void setrect(xl, yl, xh, yh)  ushort xl, yl, xh, yh;  {
  272.   ushort x, y, xll, xrr;  uchar a, b, c;
  273.   xll = xl >> 3;  xrr = xh >> 3;
  274.   a = (0xff >> (xl & 7)) & 255;  c = 0xff << (7 - (xh & 7));
  275.   for (y = yl; y <= yh; y++) {  b = a;
  276.     for (x = xll; x <= xrr; x++) {
  277.       if (x == xrr)  b &= c;
  278.       pixet(y, x, b);  b = 0xff;
  279. } } }
  280. static void setract(xl, yl, xh, yh)  ushort xl, yl, xh, yh;  {
  281.   ushort xlb, xhb, ylb, yhb, x, y;  uchar xf, yf;
  282.   xlb = xl >> 3;  xhb = xh >> 3;  ylb = yl >> 3;  yhb = yh >> 3;
  283.   if (xlb == xhb) {  xf = xh - xl + 1;
  284.     if (ylb == yhb) {  paxet(ylb, xlb, xf * (yh - yl + 1));  }  else  {
  285.       paxet(ylb, xlb, xf * (8 - (yl & 7)));
  286.       paxet(yhb, xlb, xf * ((yh & 7) + 1));
  287.       for (y = ylb + 1; y < yhb; y++)  paxet(y, xlb, xf * 8);
  288.   } }  else  if (ylb == yhb) {  yf = yh - yl + 1;
  289.     paxet(ylb, xlb, yf * (8 - (xl & 7)));
  290.     paxet(ylb, xhb, yf * ((xh & 7) + 1));
  291.     for (x = xlb + 1; x < xhb; x++)  paxet(ylb, x, yf * 8);
  292.   }  else  {  xf = 8 - (xl & 7);
  293.     for (x = xlb; x <= xhb; x++) {
  294.       yf = 8 - (yl & 7);  if (x == xhb)  xf = (xh & 7) + 1;
  295.       for (y = ylb; y <= yhb; y++) {
  296.         if (y == yhb)  yf = (yh & 7) + 1;  paxet(y, x, xf * yf);  yf = 8;
  297.       } xf = 8;
  298. } } }
  299.  
  300. static char dviname[73];
  301. static FILE *dvifile;
  302. static long dvimag;
  303. static uchar dvibuf[2048];
  304. static ushort dvibufp, dvibufe;
  305.  
  306. static void baddvi(s)  char *s;  {
  307.   fprintf(prot, "bad dvi: %s\n", s);  dispclos();  exit(1);
  308. }
  309. static void dvibytes(s, l)   char *s;  uchar l;  {  ushort ll;
  310.   s[l] = '\0';  ll = dvibufe - dvibufp;
  311.   if (ll >= l) {
  312.     memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)l);
  313.     dvibufp += l;  return;
  314.   }
  315.   if (ll > 0)  memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)ll);
  316.   dvibufe = fread(dvibuf, 1, 2048, dvifile);
  317.   if (dvibufe + ll < l)  baddvi("ends prematurely !");
  318.   memmove((ptr)(&s[ll]), (ptr)dvibuf, (long)(l - ll));
  319.   dvibufp = l - ll;
  320. }
  321. static uchar dvibyte() { uchar b;
  322.   if (dvibufp >= dvibufe) {  dvibufp = 0;
  323.     dvibufe = fread(dvibuf, 1, 2048, dvifile);
  324.   }
  325.   if (dvibufp >= dvibufe)  baddvi("ends prematurely !");
  326.   b = dvibuf[dvibufp];  dvibufp++;  return b;
  327. }
  328. static void dviskip(l)  long l;  {  uchar b;
  329.   while (l > 0) {
  330.     l += (long)dvibufp - (long)dvibufe;
  331.     if (l <= 0)  dvibufp = dvibufe + l;
  332.     else {  dvibufp = dvibufe;  l--;  dvibyte();  }
  333. } }
  334. static long dvinum(b)  uchar b;  {  uchar i;  long n;
  335.   n = 0;
  336.   if (dvibufp + b > dvibufe) {
  337.     for (i = 1; i <= b; i++)  n = (n << 8) | dvibyte();  return n;
  338.   }
  339.   for (i = 0; i < b; i++)  n = (n << 8) | dvibuf[dvibufp + i];
  340.   dvibufp += b;  return n;
  341. }
  342. static long dviint(b)  uchar b;  {  uchar i;  long n;
  343.   if (dvibufp + b <= dvibufe) {
  344.     n = dvibuf[dvibufp];
  345.     if (n > 127)  n -= 256;
  346.     for (i = 1; i < b; i++)  n = (n << 8) | dvibuf[dvibufp + i];
  347.     dvibufp += b;  return n;
  348.   }
  349.   n = dvibyte();
  350.   if (n > 127)  n -= 256;
  351.   for (i = 2; i <= b; i++)  n = (n << 8) | dvibyte();  return n;
  352. }
  353. static void dviposit(l)  long l;  {  fseek(dvifile, l, 0);
  354.   dvibufe = fread(dvibuf, 1, 2048, dvifile);  dvibufp = 0;
  355. }
  356. static void dviopen() {  long l;  uchar j, em;  ushort k;
  357.   sprintf(STR, "%s.dvi", dviname);
  358.   if ((dvifile = fopen(STR, "rb"))==0) {  strcpy(STR, dviname);
  359.     if ((dvifile = fopen(STR, "rb"))==0)  baddvi("not existing !");
  360.   }
  361.   dvibufe = fread(dvibuf, 1, 2, dvifile);
  362.   if (dvibufe < 2) baddvi("empty !");
  363.   em = dvibuf[1];
  364.   if (dvibuf[0] != 247) baddvi("no valid preamble");
  365.   /* now position to postamble */
  366.   fseek(dvifile, 0L, 2);  l=ftell(dvifile);  if(l>2048) l=2048;
  367.   fseek(dvifile, -l, 2);  k = fread(dvibuf, 1, 2048, dvifile);
  368.   do {  k--;  } while (k >= 4 && dvibuf[k] != em);
  369.   if (k < 4)  baddvi("no postamble in last 2048 bytes !");
  370.   dvibufe = k + 1;  dvibufp = k - 4;  l = dvinum(4);
  371.   fseek(dvifile, l, 0);  dvibufe = fread(dvibuf, 1, 2048, dvifile);
  372.   dvibufp = 0;  dvibyte();
  373. }
  374.  
  375. typedef union chdesc { uchar b8[16];
  376.   struct { short wid, hei, hof, vof; long bmp, tfw; } U1;
  377.   struct { long tfh, tfd, dum1, dum2; } U2;
  378. } chdesc;
  379. typedef struct fontdesc {
  380.   long dfn;  char *fonam;  chdesc *chv;
  381.   long danf;  uchar *chm;  short mch, fty;
  382. } fontdesc;
  383. static fontdesc **fontvect;
  384. static uchar fontint;
  385. static FILE *fofil;
  386. static uchar *achm, *pkbuf;
  387. static uchar fofbyte() {  uchar b;
  388.   if (fread(&b, 1, 1, fofil) <= 0) b = 0;  return b;
  389. }
  390. static long fofint(b)  uchar b;  {  uchar i;  long n;
  391.   n = fofbyte();  if (n > 127)  n -= 256;
  392.   for (i = 2; i <= b; i++)  n = (n << 8) | fofbyte();
  393.   return n;
  394. }
  395.  
  396. static long hs[smax], vs[smax], ws[smax], xs[smax], ys[smax], zs[smax];
  397. static long cnt[10];
  398. static uchar bitrev[256];
  399. static char comment[256];
  400. static double conv, vconv;
  401. static long l, landx, landy, newmag;
  402. static long a, b, c, f, q, h, v, w, x, y, z;
  403. static long chk, scf, dsz, fofchk, num, den, mag, spl, lpp, mxh, mxv;
  404. static int pagnum, pag1, paganz, i, k;
  405. static ushort s, mst, mpn;
  406. static char dviori;
  407. static uchar o, j, post, started, below;
  408.  
  409. static void initbitrev() {  uchar b, i, j, k, m, n;
  410.   for (i = 0; i <= maxink; i++) {
  411.     for (j = 0; j <= 3; j++) {  b = 0;
  412.       for (k = 0; k <= 3; k++) {
  413.     if (maskmat[j][k] <= i)  b |= maskmat[4][k];
  414.   }  maskb[i][j] = b;  } }
  415.   cb[0] = 0;  bitrev[0] = 0;  m = 0x80;  n = 1;
  416.   while (m) {  /* count bits / put bits into reverse order within a byte */
  417.     for (j = 0; j < n; j++)  {  cb[j + n] = cb[j] + 1;
  418.       bitrev[j + n] = bitrev[j] | m;
  419.     }  n += n;  m >>= 1;
  420. } }
  421. /*static long prodovz(a, b)  ushort a, b;  {  return ((long)a * (long)b);  }
  422. static long scaled(w)  long w;  {  long s;
  423.   union {  long l;  struct {  ushort n, h;  } U1;  } a, b;
  424.   a.l = w;  b.l = scf;
  425.   s = (((((ulong)prodovz(a.U1.n, b.U1.n)) >> 16) + prodovz(a.U1.n,
  426.       b.U1.h) + prodovz(a.U1.h, b.U1.n)) >> 4) +
  427.       (prodovz(a.U1.h, b.U1.h) << 12);
  428.   if (w < 0)  s -= scf << 12;  return s;
  429. }*/
  430. static long scaled(w)  long w;  {  long s; ulong t=w, u=scf;
  431.   /* should return  w * scf / 2**20  */
  432.   s = ( ( (((t & 65535L) * (u & 65535L)) >> 16)
  433.     +   (t & 65535L) * (u >>    16)
  434.     +   (t >>    16) * (u & 65535L)         ) >> 4)
  435.     + ( (   (t >>    16) * (u >>    16)         ) << 12);
  436.   if (w < 0)  s -= scf << 12;  return s;
  437. }
  438.  
  439. static void tfmdef() {  short ll, lh, bc, ec, nw, nh, nd, i;
  440.   uchar b1, b2, b3;  short FORLIM;
  441.   fontdesc *WITH = fontvect[fontint];
  442.   sprintf(STR, "%s%s.tfm", tfmprefix, FONAM);
  443.   fprintf(prot, "trying  %s  instead", STR);
  444.   fofil = fopen(STR, "rb");
  445.   if (fofil==0) {  fprintf(prot, " - absent as well :-(\n");  return;  }
  446.   ll = fofint(2);  lh = fofint(2);  bc = fofint(2);  ec = fofint(2);
  447.   nw = fofint(2);  nh = fofint(2);  nd = fofint(2);  fseek(fofil, 0L, 2);
  448.   if (ll * 4 > ftell(fofil) || ll < lh + ec - bc + nw + nh + nd + 7) {
  449.     fprintf(prot, " - not a TFMfile !\n");  fclose(fofil);  return;
  450.   }
  451.   WITH->mch = ec;
  452.   Tptr( WITH->chv = (chdesc *)calloc(WITH->mch + 1, sizeof(chdesc)) );
  453.   fseek(fofil, 24L, 0);  fofchk = fofint(4);
  454.   if (chk != 0) if (fofchk != 0) if (chk != fofchk)
  455.     fprintf(prot, " *+* wrong checksum *+* ");
  456.   fseek(fofil, (lh + ec - bc + 7L) * 4, 0);
  457.   FORLIM = nw + nh + nd;
  458.   for (i = 0; i < FORLIM; i++)
  459.     WITH->chv[i].U2.dum1 = scaled(fofint(4));
  460.   fseek(fofil, lh * 4L + 24, 0);
  461.   for (i = bc; i <= ec; i++) {
  462.     b1 = fofbyte();  b2 = fofbyte();  fofbyte();  fofbyte();
  463.     WITH->chv[i].U1.tfw = WITH->chv[b1].U2.dum1;
  464.     WITH->chv[i].U2.tfh = WITH->chv[nw + (b2 >> 4)].U2.dum1;
  465.     WITH->chv[i].U2.tfd = WITH->chv[nw + nh + (b2 & 15)].U2.dum1;
  466.   }
  467.   fclose(fofil);  WITH->fty = 1;  fprintf(prot, " - TFMfile OK\n");
  468. }
  469. static void tfmchar() {  short hr, vr, br, ar;  uchar li, re, ob, un;
  470.   chdesc *WITH = &fontvect[fontint]->chv[c];
  471.   switch (dviori) {
  472.   case 0:
  473.     hr = (short)(conv * h + 0.5)-hoff;
  474.     vr = (short)(vconv * (v - WITH->U2.tfh) + 0.5)-voff;
  475.     br = (short)(conv * (h + WITH->U1.tfw) + 0.5)-hoff;
  476.     ar = (short)(vconv * (v + WITH->U2.tfd) + 0.5)-voff;
  477.     break;
  478.   case 1:
  479.     hr = (short)(conv * (landx + v - WITH->U2.tfh) + 0.5)-hoff;
  480.     vr = (short)(vconv * (landy - h - WITH->U1.tfw) + 0.5)-voff;
  481.     br = (short)(conv * (landx + v + WITH->U2.tfd) + 0.5)-hoff;
  482.     ar = (short)(vconv * (landy - h) + 0.5)-voff;
  483.     break;
  484.   case 3:
  485.     hr = (short)(conv * (landx - v - WITH->U2.tfd) + 0.5)-hoff;
  486.     vr = (short)(vconv * (landy + h) + 0.5)-voff;
  487.     br = (short)(conv * (landx - v + WITH->U2.tfh) + 0.5)-hoff;
  488.     ar = (short)(vconv * (landy + h + WITH->U1.tfw) + 0.5)-voff;
  489.     break;
  490.   case 2:
  491.     hr = (short)(conv * (landx - h - WITH->U1.tfw) + 0.5)-hoff;
  492.     vr = (short)(vconv * (landy - v - WITH->U2.tfd) + 0.5)-voff;
  493.     br = (short)(conv * (landx - h) + 0.5)-hoff;
  494.     ar = (short)(vconv * (landy - v + WITH->U2.tfh) + 0.5)-voff;
  495.     break;
  496.   }
  497.   li = 1;  re = 1;  ob = 1;  un = 1;
  498.   if (hr < 0) {  hr = 0;  li = 0;  }
  499.   if (br > xmax) {  br = xmax;  re = 0;  }
  500.   if (vr < 0) {  vr = 0;  ob = 0;  }
  501.   if (ar > ymax) {  ar = ymax;  un = 0;  below = 1;  }
  502.   if (hr > br)  return;
  503.   if (vr > ar)  return;
  504.   if (ob)  setrect(hr, vr, br, vr);
  505.   if (li)  setrect(hr, vr, hr, ar);
  506.   if (un)  setrect(hr, ar, br, ar);
  507.   if (re)  setrect(br, vr, br, ar);
  508. }
  509. static void drawract(xl, yl, xh, yh)  ushort xl, yl, xh, yh;  {
  510.   ushort xlb, xhb, ylb, yhb, x, y;  uchar xf, yf;
  511.   xlb = xl >> 3;  xhb = xh >> 3;  ylb = yl >> 3;  yhb = yh >> 3;
  512.   if (xlb == xhb) {  xf = xh - xl;
  513.     if (ylb == yhb) {  paxet(ylb, xlb, (xf + yh - yl) << 1);  }  else  {
  514.       paxet(ylb, xlb, xf - ((yl & 7) << 1) + 15);
  515.       paxet(yhb, xlb, xf + ((yh & 7) << 1) + 1);
  516.       for (y = ylb + 1; y < yhb; y++)  paxet(y, xlb, maxink);  return;
  517.   } }  else  if (ylb == yhb) {  yf = yh - yl;
  518.     paxet(ylb, xlb, yf - ((xl & 7) << 1) + 15);
  519.     paxet(ylb, xhb, yf + ((xh & 7) << 1) + 1);
  520.     for (x = xlb + 1; x < xhb; x++)  paxet(ylb, x, maxink);  return;
  521.   }  else  {
  522.     for (x = xlb + 1; x < xhb; x++) {  paxet(ylb, x, 8);  paxet(yhb, x, 8);  }
  523.     for (y = ylb + 1; y < yhb; y++) {  paxet(y, xlb, 8);  paxet(y, xhb, 8);  }
  524.     paxet(ylb, xlb, 15 - (yl & 7) - (xl & 7));
  525.     paxet(ylb, xhb, (xh & 7) - (yl & 7) + 8);
  526.     paxet(yhb, xlb, (yh & 7) - (xl & 7) + 8);
  527.     paxet(yhb, xhb, (xh & 7) + (yh & 7) + 1);
  528. } }
  529. static void tfmcher() {  short hr, vr, br, ar;
  530.   chdesc *WITH = &fontvect[fontint]->chv[c];
  531.   switch (dviori) {
  532.   case 0:
  533.     hr = (short)(conv * h + 0.5);
  534.     vr = (short)(vconv * (v - WITH->U2.tfh) + 0.5);
  535.     br = (short)(conv * (h + WITH->U1.tfw) + 0.5);
  536.     ar = (short)(vconv * (v + WITH->U2.tfd) + 0.5);
  537.     break;
  538.   case 1:
  539.     hr = (short)(conv * (landx + v - WITH->U2.tfh) + 0.5);
  540.     vr = (short)(vconv * (landy - h - WITH->U1.tfw) + 0.5);
  541.     br = (short)(conv * (landx + v + WITH->U2.tfd) + 0.5);
  542.     ar = (short)(vconv * (landy - h) + 0.5);
  543.     break;
  544.   case 3:
  545.     hr = (short)(conv * (landx - v - WITH->U2.tfd) + 0.5);
  546.     vr = (short)(vconv * (landy + h) + 0.5);
  547.     br = (short)(conv * (landx - v + WITH->U2.tfh) + 0.5);
  548.     ar = (short)(vconv * (landy + h + WITH->U1.tfw) + 0.5);
  549.     break;
  550.   case 2:
  551.     hr = (short)(conv * (landx - h - WITH->U1.tfw) + 0.5);
  552.     vr = (short)(vconv * (landy - v - WITH->U2.tfd) + 0.5);
  553.     br = (short)(conv * (landx - h) + 0.5);
  554.     ar = (short)(vconv * (landy - v + WITH->U2.tfh) + 0.5);
  555.     break;
  556.   }
  557.   if (hr < 0)  hr = 0;  if (br > xmax)  br = xmax;
  558.   if (vr < 0)  vr = 0;  if (ar > ymax)  ar = ymax;
  559.   if (hr <= br)  if (vr <= ar)  drawract(hr, vr, br, ar);
  560. }
  561.  
  562. #define PKN1 *achm++
  563. static short pki1()  {  short b;
  564.   b = PKN1;  if (b > 127)  b -= 256;  return b;
  565. }
  566. static short pkn2()  {  short b;
  567.   b = PKN1;  return (b * 256 + PKN1);
  568. }
  569. static short pki2()  {  short b;
  570.   b = PKN1;  if (b > 127)  b -= 256;
  571.   return (b * 256 + PKN1);
  572. }
  573. static long pkn3()  {  long b;  short c;
  574.   b = PKN1;  c = PKN1;
  575.   return ((b * 256 + c) * 256 + PKN1);
  576. }
  577. static long pki3()  {  long b;
  578.   b = pki1();  return (b * 65536L + pkn2());
  579. }
  580. static long pki4()  {  long b;
  581.   b = pki2();  return (b * 65536L + pkn2());
  582. }
  583. static void pkdef()  {  long a, l;  ushort d;  uchar b, bb;
  584.   uchar terminate;  short i, j, c;  fontdesc *WITH;  chdesc *WITH1;
  585.   WITH = fontvect[fontint];  sprintf(STR, "%spk", FOFUL);
  586.   fprintf(prot,"preparing font %ld: %s", f, STR);
  587.   if( (fofil = fopen(STR, "rb"))==0) {
  588.     fprintf(prot," not found :-(\n");
  589.     sprintf(STR, "%spk", FOLOC);
  590.     fprintf(prot,"preparing font %ld: %s", f, STR);
  591.     fofil = fopen(STR, "rb");
  592.   }
  593.   if (fofil==0) {  WITH->mch = -1;
  594.     fprintf(prot, " - file not found !\n");  return;
  595.   }
  596.   if ((fgetc(fofil)!=0xf7)||(fgetc(fofil)!=0x59)){  WITH->mch = -1;
  597.     fprintf(prot, " - not a PKfile !\n");  fclose(fofil);  return;
  598.   } else {
  599.     fseek(fofil, 0L, 2);  WITH->danf = ftell(fofil);
  600.     if (WITH->danf > 65520L) {  WITH->mch = -1;  fclose(fofil);
  601.       fprintf(prot, " - too big for this driver\n");  return;
  602.     } else {
  603.       Tptr( WITH->chv = (chdesc *)calloc(256, sizeof(chdesc)) );
  604.       Tptr( pkbuf = (uchar *)malloc(WITH->danf) );
  605.       fseek(fofil, 0L, 0);  fread(pkbuf, WITH->danf, 1, fofil);
  606.       fclose(fofil);  WITH->mch = -1;  achm=pkbuf;  terminate = 0;
  607.       do {  b = PKN1;
  608.     if (b >= 240) {
  609.       switch (b) {
  610.       case 240:  case 241:  case 242:  case 243: l = 0;
  611.         for (i = 240; i <= b; i++)  l = (l << 8) + PKN1;
  612.         achm += l;  break;
  613.       case 244:  achm += 4;  break;
  614.       case 245:  terminate = 1;  break;
  615.       case 246:  break;
  616.       case 247:  b = PKN1;  i = PKN1;
  617.         achm += i + 4;  fofchk = pki4();
  618.         if (chk != 0) if (fofchk != 0) if (chk != fofchk)
  619.              fprintf(prot, " *+* wrong checksum *+* ");
  620.         achm += 8;  break;
  621.       case 248:  case 249:  case 250:  case 251:
  622.       case 252:  case 253:  case 254:  case 255:  break;
  623.       }
  624.     } else {  d = (achm - pkbuf) - 1;  bb = b & 7;
  625.       switch (bb) {
  626.       case 0:  case 1:  case 2:  case 3:
  627.         l = bb * 256 + PKN1 - 8;  c = PKN1;  break;
  628.       case 4:  case 5:  case 6:  l = bb - 4;
  629.         l = (l << 16) + pkn2() - 13;  c = PKN1;  break;
  630.       case 7:  l = pki4() - 28;  c = pki4();  break;
  631.       }
  632.       WITH1 = &WITH->chv[c];
  633.       switch (bb) {
  634.       case 0:  case 1:  case 2:  case 3:
  635.         WITH1->U1.tfw = scaled(pkn3());  PKN1;
  636.         WITH1->U1.wid = PKN1;  WITH1->U1.hei = PKN1;
  637.             WITH1->U1.hof = pki1();  WITH1->U1.vof = pki1();  break;
  638.       case 4:  case 5:  case 6:
  639.         WITH1->U1.tfw = scaled(pkn3());  pkn2();
  640.         WITH1->U1.wid = pkn2();  WITH1->U1.hei = pkn2();
  641.             WITH1->U1.hof = pki2();  WITH1->U1.vof = pki2();  break;
  642.       case 7:
  643.         WITH1->U1.tfw = scaled(pki4());  pki4();  pki4();
  644.         WITH1->U1.wid = pki4();   WITH1->U1.hei = pki4();
  645.             WITH1->U1.hof = pki4();   WITH1->U1.vof = pki4();  break;
  646.       }
  647.       achm += l;
  648.       if ((unsigned)c <= 255) {
  649.         if (WITH->mch < c)  WITH->mch = c;
  650.         WITH->chv[c].U1.bmp = d;
  651.       }    } } while (!terminate); free(pkbuf);
  652.       if (WITH->mch < 0)  fprintf(prot, " - PKfile in error !\n");
  653.        else  fprintf(prot, " - available\n");
  654.       WITH->chv = (chdesc *) realloc(WITH->chv, 16*(WITH->mch + 1));
  655.       Tptr( WITH->fonam = (char *) malloc(strlen(STR)+1) );
  656.       strcpy(WITH->fonam, STR);
  657. } } }
  658. static struct  {  long repc, count;  short xs, wid1, dynf, dyng, dynh;
  659.   ushort d;  uchar db, white, bmerk, buf[ym + 1];
  660. }  Lpkc;
  661. static uchar pknib()  {  uchar Result;
  662.   if (Lpkc.bmerk != 0) {
  663.     Result = Lpkc.bmerk & 0xf;  Lpkc.bmerk = 0;  return Result;
  664.   }
  665.   Lpkc.bmerk = PKN1;  Result = Lpkc.bmerk >> 4;
  666.   Lpkc.bmerk |= 0xf0;  return Result;
  667. }
  668. static long pknum()  {  uchar i, j, k;  long n;
  669.   k = 1;
  670.   do {  i = pknib();  k++;
  671.     if (i == 0) {
  672.       do {  j = pknib();  i++;  } while (j == 0);
  673.       n = j;
  674.       while (i > 0) {  i--;  n = (n << 4) + pknib();  }
  675.       n += Lpkc.dyng;
  676.     } else if (i <= Lpkc.dynf)  n = i;
  677.     else if (i < 14)  n = (i << 4) + pknib() + Lpkc.dynh;
  678.     else if (i == 14)  k = 0;
  679.     else {  k = 1;  n = 1;  }
  680.     if (k == 1)  Lpkc.repc = n;
  681.   } while (k != 2);  return n;
  682. }
  683. static void pkline()  { short j, x=0; uchar dd;
  684.   if (Lpkc.dynf == 14) {
  685.     j = Lpkc.wid1 + Lpkc.xs;
  686.     Lpkc.db += Lpkc.xs;
  687.     do {
  688.       if (Lpkc.db < 8)    Lpkc.d = (Lpkc.d << 8) | PKN1;
  689.       else  Lpkc.db -= 8;
  690.       dd = (Lpkc.d >> Lpkc.db) & 255;
  691.       if (j >= 8) {  j -= 8;    Lpkc.buf[x] = dd;
  692.       } else {    Lpkc.db += 8 - j;
  693.     Lpkc.buf[x] = dd & (0xff00L >> j) & 255;
  694.     j = 0;
  695.       }  x++;
  696.     } while (j != 0);
  697.     Lpkc.d &= 0xffffL >> (16 - Lpkc.db);  return;
  698.   }
  699.   j = Lpkc.wid1;  Lpkc.db = 8 - Lpkc.xs;  Lpkc.d = 0;
  700.   if (Lpkc.repc > 0) {  Lpkc.repc--;  return;  }
  701.   while (j > 0) {
  702.     if (Lpkc.count == 0) { Lpkc.count = pknum();  Lpkc.white = !Lpkc.white; }
  703.     dd = Lpkc.db;
  704.     if (dd > j)  dd = j;
  705.     if (dd > Lpkc.count)  dd = Lpkc.count;
  706.     if (Lpkc.white)  Lpkc.db -= dd;
  707.     else {  Lpkc.d += 1 << Lpkc.db;
  708.       Lpkc.db -= dd;  Lpkc.d -= 1 << Lpkc.db;
  709.     }
  710.     Lpkc.count -= dd;  j -= dd;
  711.     if (Lpkc.db == 0 || j == 0) {
  712.       Lpkc.buf[x] = Lpkc.d & 255;
  713.       x++;  Lpkc.d = 0;  Lpkc.db = 8;
  714. } } }
  715. static void pkchar()  {  short hr, vr;  long bma, bmx;
  716.   short x, x1, x2, x3, y1, y2, y;  uchar b, bb, mach, mac, mpm, bach;
  717.   fontdesc *WITH;  chdesc *WITH1;
  718.   WITH = fontvect[fontint];  WITH1 = &WITH->chv[c];
  719.   achm += WITH1->U1.bmp;  b = PKN1;
  720.   Lpkc.white = ((b & 8) == 0);  Lpkc.wid1 = WITH1->U1.wid;
  721.   Lpkc.dynf = b >> 4;
  722.   Lpkc.dyng = (13 - Lpkc.dynf) * 16 + Lpkc.dynf - 15;
  723.   Lpkc.dynh = -(Lpkc.dynf + 1) * 15;  bb = b & 7;
  724.   switch (bb) {
  725.   case 0:  case 1:  case 2:  case 3:  achm += 10;  break;
  726.   case 4:  case 5:  case 6:  achm += 16;  break;
  727.   case 7:  achm += 36;  break;
  728.   }
  729.   Lpkc.bmerk = 0;  Lpkc.d = 0;  Lpkc.db = 0;  Lpkc.repc = 0;
  730.   Lpkc.count = 0;  Lpkc.white = !Lpkc.white;
  731.   switch (dviori) {
  732.   case 0:
  733.     hr = (short)(conv * h + 0.5) - WITH1->U1.hof-hoff;
  734.     vr = (short)(vconv * v + 0.5) - WITH1->U1.vof-voff;
  735.     if (vr > ymax)  below = 1;  else {
  736.       if (vr + WITH1->U1.hei >= 1) {
  737.     x1 = (hr & -8L) / 8;  x2 = ((hr + WITH1->U1.wid - 1) & -8L) / 8;
  738.     Lpkc.xs = hr & 7;    y2 = vr + WITH1->U1.hei - 1;
  739.     if (y2 > ymax) {  y2 = ymax;  below = 1;  }
  740.     x3 = x1;  if (x3 < 0) x3 = 0;  if (x2 > xmb) x2 = xmb;
  741.     if (x3 <= x2) {
  742.       for (y = vr; y <= y2; y++) {  pkline();
  743.         if (y >= 0) {
  744.           for (x = x3; x <= x2; x++)
  745.         pixet(y, x, Lpkc.buf[x-x1]);
  746.     } } } } }  break;
  747.   case 1:
  748.     hr = (short)(conv * (landx + v) + 0.5) - WITH1->U1.vof-hoff;
  749.     vr = (short)(vconv * (landy - h) + 0.5) + WITH1->U1.hof-voff;
  750.     if (vr - WITH1->U1.wid + 1 > ymax)  below = 1;  else {
  751.       if (vr >= 0) {  Lpkc.xs = 0;  mac = 0x80;  bma = 0;    y1 = vr;
  752.     if (y1 > ymax) {  below = 1;  bma += ((ulong)(y1 - ymax)) >> 3;
  753.       mac = 0x80 >> ((y1 - ymax) & 7);  y1 = ymax;
  754.     }
  755.     y2 = vr - WITH1->U1.wid + 1;  if (y2 < 0)  y2 = 0;
  756.     x2 = hr + WITH1->U1.hei - 1;  if (x2 > xmax)  x2 = xmax;
  757.     for (x3 = hr; x3 <= x2; x3++) {  pkline();
  758.       if (x3 >= 0) {
  759.         mach = mac;  x = ((unsigned)x3) >> 3;
  760.         mpm = 0x80 >> (x3 & 7);  bmx = bma;  bach = Lpkc.buf[bmx];
  761.         for (y = y1; y >= y2; y--) {
  762.           if ((bach & mach) != 0)  pixet(y, x, mpm);
  763.           mach >>= 1;
  764.           if (mach == 0) {
  765.         mach = 0x80;  bmx++;  bach = Lpkc.buf[bmx];
  766.     } } } } } }  break;
  767.   case 3:
  768.     hr = (short)(conv * (landx - v) + 0.5) + WITH1->U1.vof-hoff;
  769.     vr = (short)(vconv * (landy + h) + 0.5) - WITH1->U1.hof-voff;
  770.     if (vr > ymax)  below = 1;  else {
  771.       if (vr + WITH1->U1.wid >= 1) {
  772.     Lpkc.xs = 0;  mac = 0x80;  bma = 0;  y1 = vr;
  773.     if (y1 < 0) {  bma += ((unsigned)(-y1)) >> 3;
  774.       mac = 0x80 >> ((-y1) & 7);  y1 = 0;
  775.     }
  776.     y2 = vr + WITH1->U1.wid - 1;
  777.     if (y2 > ymax) {  y2 = ymax;  below = 1;  }
  778.     x2 = hr - WITH1->U1.hei + 1;  if (x2 < 0)  x2 = 0;
  779.     for (x3 = hr; x3 >= x2; x3--) {  pkline();
  780.       if (x3 <= xmax) {
  781.         mach = mac;  x = ((unsigned)x3) >> 3;
  782.         mpm = 0x80 >> (x3 & 7);  bmx = bma;  bach = Lpkc.buf[bmx];
  783.         for (y = y1; y <= y2; y++) {
  784.           if ((bach & mach) != 0)  pixet(y, x, mpm);
  785.           mach >>= 1;
  786.           if (mach == 0) {
  787.         mach = 0x80;  bmx++;  bach = Lpkc.buf[bmx];
  788.     } } } } } }  break;
  789.   case 2:
  790.     hr = (short)(conv * (landx - h) + 0.5) + WITH1->U1.hof-hoff;
  791.     vr = (short)(vconv * (landy - v) + 0.5) + WITH1->U1.vof-hoff;
  792.     if (vr - WITH1->U1.hei + 1 > ymax)  below = 1;  else {
  793.       if (vr >= 0) {
  794.     x1 = (hr & -8L) / 8;  x2 = ((hr - WITH1->U1.wid + 1) & -8L) / 8;
  795.     Lpkc.xs = (7 - hr) & 7;  y2 = vr - WITH1->U1.hei + 1;
  796.     if (y2 < 0)  y2 = 0;
  797.     if (vr > ymax)  below = 1;
  798.     if (x2 < 0) x2 = 0;  x3 = x1;  if (x3 > xmb) x3 = xmb;
  799.     if (x2 <= x3) {
  800.       for (y = vr; y >= y2; y--) {  pkline();
  801.         if (y <= ymax) {
  802.           for (x = x3; x >= x2; x--)
  803.         pixet(y, x, bitrev[Lpkc.buf[x1 - x]]);
  804.     } } } } }  break;
  805. } }
  806. static void pklene() {  short j;  uchar dd;  short s = 0;
  807.   if (Lpkc.dynf == 14) {  j = Lpkc.wid1 + Lpkc.xs;  Lpkc.db += Lpkc.xs;
  808.     do {
  809.       if (Lpkc.db < 8)    Lpkc.d = (Lpkc.d << 8) | PKN1;
  810.       else  Lpkc.db -= 8;
  811.       dd = (Lpkc.d >> Lpkc.db) & 255;
  812.       if (j >= 8) {  j -= 8;  Lpkc.buf[s] = cb[dd];
  813.       } else {    Lpkc.db += 8 - j;
  814.         Lpkc.buf[s] = cb[dd & (0xff00L >> j) & 255];  j = 0;
  815.       }  s++;
  816.     } while (j != 0);
  817.     Lpkc.d &= 0xffffL >> (16 - Lpkc.db);  return;
  818.   }
  819.   j = Lpkc.wid1;  Lpkc.db = 8 - Lpkc.xs;  Lpkc.d = 0;
  820.   if (Lpkc.repc > 0) {  Lpkc.repc--;  return;  }
  821.   while (j > 0) {
  822.     if (Lpkc.count == 0) {  Lpkc.count = pknum();  Lpkc.white = !Lpkc.white;  }
  823.     dd = Lpkc.db;  if (dd > j)  dd = j;
  824.     if (dd > Lpkc.count)  dd = Lpkc.count;
  825.     if (!Lpkc.white)  Lpkc.d += dd;
  826.     Lpkc.db -= dd;  Lpkc.count -= dd;  j -= dd;
  827.     if (Lpkc.db == 0 || j == 0) {
  828.       Lpkc.buf[s] = Lpkc.d;  s++;  Lpkc.d = 0;  Lpkc.db = 8;
  829. } } }
  830. static void pkcher() {  short hr, vr, br, ar;
  831.   ushort s, s1, s2, t, t1, t2;
  832.   uchar ts, te, tr, tt, b, bb;  uchar sum[ym + 1];
  833.   fontdesc *WITH;  chdesc *WITH1;
  834.   WITH = fontvect[fontint];  WITH1 = &WITH->chv[c];
  835.   achm += WITH1->U1.bmp;  b = PKN1;
  836.   Lpkc.white = ((b & 8) == 0);  Lpkc.wid1 = WITH1->U1.wid;
  837.   Lpkc.dynf = b >> 4;
  838.   Lpkc.dyng = (13 - Lpkc.dynf) * 16 + Lpkc.dynf - 15;
  839.   Lpkc.dynh = -(Lpkc.dynf + 1) * 15;  bb = b & 7;
  840.   switch (bb) {
  841.   case 0:  case 1:  case 2:  case 3:  achm += 10;  break;
  842.   case 4:  case 5:  case 6:  achm += 16;  break;
  843.   case 7:  achm += 36;  break;
  844.   }
  845.   Lpkc.bmerk = 0;  Lpkc.d = 0;  Lpkc.db = 0;  Lpkc.repc = 0;
  846.   Lpkc.count = 0;  Lpkc.white = !Lpkc.white;
  847.   switch (dviori) {
  848.   case 0:
  849.     hr = (short)(conv * h + 0.5) - WITH1->U1.hof;
  850.     br = hr + WITH1->U1.wid - 1;
  851.     vr = (short)(vconv * v + 0.5) - WITH1->U1.vof;
  852.     ar = vr + WITH1->U1.hei - 1;
  853.     if (vr >= 0) if (ar <= ymax) if (hr >= 0) if (br <= xmax) {
  854.       s1 = hr >> 3;  s2 = br >> 3;  Lpkc.xs = hr & 7;
  855.       t1 = vr >> 3;  t2 = ar >> 3;  ts = vr & 7;
  856.       te = 7;  tr = ar & 7;
  857.       for (t = t1; t <= t2; t++) {  if (t == t2)  te = tr;
  858.         for (s = s1; s <= s2; s++)  sum[s] = 0;
  859.         for (tt = ts; tt <= te; tt++) {  pklene();
  860.           for (s = s1; s <= s2; s++)  sum[s] += Lpkc.buf[s - s1];
  861.         }  ts = 0;  for (s = s1; s <= s2; s++)  paxet(t, s, sum[s]);
  862.     } }  break;
  863.   case 1:
  864.     hr = (short)(conv * (landx + v) + 0.5) - WITH1->U1.vof;
  865.     br = hr + WITH1->U1.hei - 1;
  866.     vr = (short)(vconv * (landy - h) + 0.5) + WITH1->U1.hof;
  867.     ar = vr - WITH1->U1.wid + 1;
  868.     if (ar >= 0) if (vr <= ymax) if (hr >= 0) if (br <= xmax) {
  869.       s1 = vr >> 3;  s2 = ar >> 3;  Lpkc.xs = 7 - (vr & 7);
  870.       t1 = hr >> 3;  t2 = br >> 3;  ts = hr & 7;
  871.       te = 7;  tr = br & 7;
  872.       for (t = t1; t <= t2; t++) {  if (t == t2)  te = tr;
  873.         for (s = s1; s >= s2; s--)  sum[s] = 0;
  874.         for (tt = ts; tt <= te; tt++) {  pklene();
  875.           for (s = s1; s >= s2; s--)  sum[s] += Lpkc.buf[s1 - s];
  876.         }  ts = 0;  for (s = s1; s >= s2; s--)  paxet(s, t, sum[s]);
  877.     } }  break;
  878.   case 3:
  879.     hr = (short)(conv * (landx - v) + 0.5) + WITH1->U1.vof;
  880.     br = hr - WITH1->U1.hei + 1;
  881.     vr = (short)(vconv * (landy + h) + 0.5) - WITH1->U1.hof;
  882.     ar = vr + WITH1->U1.wid - 1;
  883.     if (vr >= 0) if (ar <= ymax) if (br >= 0) if (hr <= xmax) {
  884.       s1 = vr >> 3;  s2 = ar >> 3;  Lpkc.xs = vr & 7;
  885.       t1 = hr >> 3;  t2 = br >> 3;  ts = 7 - (hr & 7);
  886.       te = 7;   tr = 7 - (br & 7);
  887.       for (t = t1; t >= t2; t--) {  if (t == t2)  te = tr;
  888.         for (s = s1; s <= s2; s++)  sum[s] = 0;
  889.         for (tt = ts; tt <= te; tt++) {  pklene();
  890.           for (s = s1; s <= s2; s++)  sum[s] += Lpkc.buf[s - s1];
  891.         }  ts = 0;  for (s = s1; s <= s2; s++)  paxet(s, t, sum[s]);
  892.     } }  break;
  893.   case 2:
  894.     hr = (short)(conv * (landx - h) + 0.5) + WITH1->U1.hof;
  895.     br = hr - WITH1->U1.wid + 1;
  896.     vr = (short)(vconv * (landy - v) + 0.5) + WITH1->U1.vof;
  897.     ar = vr - WITH1->U1.hei + 1;
  898.     if (ar >= 0) if (vr <= ymax) if (br >= 0) if (hr <= xmax) {
  899.       s1 = hr >> 3;  s2 = br >> 3;  Lpkc.xs = 7 - (hr & 7);
  900.       t1 = vr >> 3;  t2 = ar >> 3;  ts = 7 - (vr & 7);
  901.       te = 7;  tr = 7 - (ar & 7);
  902.       for (t = t1; t >= t2; t--) {  if (t == t2)  te = tr;
  903.         for (s = s1; s >= s2; s--)  sum[s] = 0;
  904.     for (tt = ts; tt <= te; tt++) {  pklene();
  905.           for (s = s1; s >= s2; s--)  sum[s] += Lpkc.buf[s1 - s];
  906.         }  ts = 0;  for (s = s1; s >= s2; s--)  paxet(t, s, sum[s]);
  907.     } }  break;
  908. } }
  909.  
  910. static void fontdef() {  uchar a, b, p, q;  fontdesc *WITH;
  911.   if (f < 0)  baddvi("negative fontnumber");
  912.   b = f & 0xff;  a = 0;
  913.   if ((f > 255) || (fontvect[b] != NULL)) do {
  914.     if (fontvect[a] == NULL)  b = a;
  915.     else if (fontvect[a]->dfn == f)  baddvi("double fontnumber");
  916.     a++;
  917.   } while (a);
  918.   if (fontvect[b] != NULL)  baddvi("too many fonts");
  919.   fontint = b;
  920.   Tptr( fontvect[b] = (fontdesc *)malloc(sizeof(fontdesc)) );
  921.   WITH = fontvect[fontint];  WITH->dfn = f;
  922.   chk = dvinum(4);  scf = dvinum(4);  dsz = dvinum(4);
  923.   WITH->chm = NULL;  WITH->fty = -1;
  924.   p = dvibyte();  q = dvibyte();  dvibytes(FONAM, q);
  925.   if (p == 0)  strcpy(FOPRE, fontprefix);  else dvibytes(FOPRE, p);
  926.   sprintf(FOMAG, "%ld",
  927.       (long)(xres * dvimag / 1000.0 * ((double)scf / dsz) + 0.5));
  928. #ifdef __MSDOS__
  929.   sprintf(FOFUL, "%s%s\\%s.", FOPRE, FOMAG, FONAM);
  930.   sprintf(FOLOC, "%s.", FONAM);
  931. #else
  932.   sprintf(FOFUL, "%s%s.%s", FOPRE, FONAM, FOMAG);
  933.   sprintf(FOLOC, "%s.%s", FONAM, FOMAG);
  934. #endif
  935.   pkdef();  if (WITH->mch < 0)  tfmdef();
  936. }
  937.  
  938. static void fontlod() { uchar b = 0;
  939.   fontdesc *WITH = fontvect[fontint];
  940.   WITH->chm = (uchar *)malloc(WITH->danf);
  941.   if (WITH->chm == NULL) { do {
  942.       if (fontvect[b] != NULL) {
  943.     if (fontvect[b]->chm) free(fontvect[b]->chm);
  944.     fontvect[b]->chm = NULL;
  945.       }  b++;
  946.     } while (b);
  947.     Tptr( WITH->chm = (uchar *)malloc(WITH->danf) );
  948.   }
  949.   fofil = fopen(WITH->fonam, "rb");
  950.   fread(WITH->chm, WITH->danf, 1, fofil);  fclose(fofil);
  951. }
  952.  
  953. static void fontset() {  uchar a, b, x;
  954.   b = f & 0xff;  x = 0;
  955.   if (fontvect[b] != NULL)  if (fontvect[b]->dfn == f)  x = 1;
  956.   if (x == 0) {  a = 0;
  957.     do {
  958.       if (fontvect[a] == NULL)    a++;
  959.       else if (fontvect[a]->dfn != f)  a++;
  960.       else {  x = 1;  b = a;  a = 0;  }
  961.     } while (a != 0);
  962.   }
  963.   if (x == 0)  baddvi("undefined fontnumber");
  964.   fontint = b;
  965. }
  966. static void putrale() {  short hr, vr, br, ar;
  967.   if (b <= 0)  return;
  968.   switch (dviori) {
  969.   case 0:
  970.     hr = (short)(conv * h + 0.5);
  971.     vr = (short)(vconv * (v - a) + 0.5);
  972.     br = (short)(conv * b + 0.5);  if (br > 0)  br--;
  973.     ar = (short)(vconv * a + 0.5);
  974.     break;
  975.   case 1:
  976.     hr = (short)(conv * (landx + v - a) + 0.5);
  977.     vr = (short)(vconv * (landy - h - b) + 0.5);
  978.     br = (short)(conv * a + 0.5);
  979.     ar = (short)(vconv * b + 0.5);  if (ar > 0)  ar--;
  980.     break;
  981.   case 3:
  982.     hr = (short)(conv * (landx - v) + 0.5);
  983.     vr = (short)(vconv * (landy + h) + 0.5);
  984.     br = (short)(conv * a + 0.5);
  985.     ar = (short)(vconv * b + 0.5);  if (ar > 0)  ar--;
  986.     break;
  987.   case 2:
  988.     hr = (short)(conv * (landx - h - b) + 0.5);
  989.     vr = (short)(vconv * (landy - v) + 0.5);
  990.     br = (short)(conv * b + 0.5);  if (br > 0)  br--;
  991.     ar = (short)(vconv * a + 0.5);
  992.     break;
  993.   }
  994.   ar += vr;  br += hr;
  995.   if (hr < 0)  hr = 0;
  996.   if (br > xmax)  br = xmax;
  997.   if (vr < 0)  vr = 0;
  998.   if (ar > ymax) {  ar = ymax;  below = 1;  }
  999.   if (hr <= br)  if (vr <= ar) {
  1000.     setract(hr, vr, br, ar);
  1001. } }
  1002. static void putrule() {  short hr, vr, br, ar;
  1003.   if (b <= 0)  return;
  1004.   if (alles)  {  putrale();  return;  }
  1005.   switch (dviori) {
  1006.   case 0:
  1007.     hr = (short)(conv * h + 0.5)-hoff;
  1008.     vr = (short)(vconv * (v - a) + 0.5)-voff;
  1009.     br = (short)(conv * b + 0.5);  if (br > 0)  br--;
  1010.     ar = (short)(vconv * a + 0.5);
  1011.     break;
  1012.   case 1:
  1013.     hr = (short)(conv * (landx + v - a) + 0.5)-hoff;
  1014.     vr = (short)(vconv * (landy - h - b) + 0.5)-voff;
  1015.     br = (short)(conv * a + 0.5);
  1016.     ar = (short)(vconv * b + 0.5);  if (ar > 0)  ar--;
  1017.     break;
  1018.   case 3:
  1019.     hr = (short)(conv * (landx - v) + 0.5)-hoff;
  1020.     vr = (short)(vconv * (landy + h) + 0.5)-voff;
  1021.     br = (short)(conv * a + 0.5);
  1022.     ar = (short)(vconv * b + 0.5);  if (ar > 0)  ar--;
  1023.     break;
  1024.   case 2:
  1025.     hr = (short)(conv * (landx - h - b) + 0.5)-hoff;
  1026.     vr = (short)(vconv * (landy - v) + 0.5)-voff;
  1027.     br = (short)(conv * b + 0.5);  if (br > 0)  br--;
  1028.     ar = (short)(vconv * a + 0.5);
  1029.     break;
  1030.   }
  1031.   ar += vr;  br += hr;
  1032.   if (hr < 0)  hr = 0;
  1033.   if (br > xmax)  br = xmax;
  1034.   if (vr < 0)  vr = 0;
  1035.   if (ar > ymax) {  ar = ymax;  below = 1;  }
  1036.   if (hr <= br)  if (vr <= ar) {
  1037.     setrect(hr, vr, br, ar);
  1038. } }
  1039. static void putchar_() {  fontdesc *WITH;  chdesc *WITH1;
  1040.   WITH = fontvect[fontint];
  1041.   if (c > WITH->mch) {  q = 0;  return;  }
  1042.   WITH1 = &WITH->chv[c];  q = WITH1->U1.tfw;
  1043.   if (WITH->fty == 1) {  if (alles) tfmcher(); else tfmchar();  return;  }
  1044.   if (WITH1->U1.bmp == 0)  return;
  1045.   if (WITH->chm == NULL)  fontlod();
  1046.   achm = WITH->chm;  if(alles) pkcher(); else pkchar();
  1047. }
  1048. static void pageinit() {  greydesc *WITH;
  1049.   s = 0;  w = 0;  x = 0;  y = 0;  z = 0;
  1050.   if (alles) {
  1051.     h = (long)(xres / conv + 0.5);
  1052.     v = (long)(yres / vconv + 0.5);
  1053.   }  else  {  h = 0;  v = 0;  }
  1054.   for (j = 0; j <= 7; j++) {  WITH = &greymask[j];
  1055.     WITH->maskc = 0xff;  WITH->maskm = 0xff;  WITH->masky = 0xff;
  1056.   }  darkfac = maxink;
  1057. }
  1058. static void pagebeg() {  uchar j;
  1059.   for (j = 0; j <= 9; j++)  cnt[j] = dvinum(4);
  1060.   lpp = dvinum(4);  pagnum++;  alles = 3;
  1061.   if (pagnum >= pag1) {  started = 1;  }
  1062.   zoelli = ftell(dvifile);  zoelli += (long)dvibufp - (long)dvibufe;
  1063.   dispopen(); pageinit();
  1064. }
  1065. static void pageend() { char np;
  1066.   if (s != 0)  fprintf(prot, "Stack not empty at EOP\n");
  1067.   if (!started)  return;  dispcopy();
  1068.   if (alles)  np = 0;  else  np = evalkbd();
  1069.   if (np == 0) {  dviposit(zoelli);  pageinit();
  1070.     dispopen();
  1071.   }
  1072.   if (np < 0) if (lpp) dviposit(lpp);
  1073. }
  1074. static void deffont() {  ushort l, m;
  1075.   if (!post) {  fontdef();  return;  }
  1076.   dviskip(12L);  l = dvibyte();  m = dvibyte();  dviskip((long)(l + m));
  1077. }
  1078. static void special() {  long i, j, k;  char *parm;
  1079.   double x, y, cy, ma, ye, bl;  short cle, m, n, b;
  1080.   if (spl > 255) {  fprintf(prot, "special >>");
  1081.     for (i = spl; i > 0; i--)  fputc(dvibyte(), prot);
  1082.     fprintf(prot, "<< ignored\n");  return;
  1083.   }
  1084.   dvibytes(comment, (int)spl);
  1085.   if (!memcmp(comment, "landend", 7)) {  dviori = 0;  return;  }
  1086.   if (!memcmp(comment, "landstart", 9)) {
  1087.     if (comment[10] == '1')  dviori = 1;
  1088.     else if (comment[10] == '0')  dviori = 3;
  1089.     else dviori = 2;
  1090.     sscanf(comment+12, "%lg%lg", &x,&y);
  1091.     j = (long)(x * 65535L + 0.5);
  1092.     k = (long)(y * 65535L + 0.5);
  1093.     switch (dviori) {
  1094.     case 1:  landx = h - v;  landy = v + j + h;  break;
  1095.     case 3:  landx = h + k + v;  landy = v - h;  break;
  1096.     case 2:  landx = h + h + k;  landy = v + j + v;  break;
  1097.   } return; }
  1098.   if (memcmp(comment, "color", 5)) {
  1099.     fprintf(prot, "special >>%s<< ignored", comment);  return;
  1100.   }
  1101.   parm = comment+6;
  1102.   if (!memcmp(parm, "pop", 3)) {  parm +=4;  colst--;
  1103.     if (colst < 0) {  colst = 0;  fprintf(prot, " color stack underflow"); }
  1104.   } else {
  1105.     if (!memcmp(parm, "push cmyk", 9)) {  parm +=10;  colst++;
  1106.       if (colst > smax-1) { colst = smax-1;
  1107.         fprintf(prot, " color stack overflow");
  1108.     } }
  1109.     if (sscanf(parm,"%lg%lg%lg%lg",&cy,&ma,&ye,&bl)<4) {
  1110.       fprintf(prot," color: cmyk values <%s> incomplete ",comment); return;
  1111.     }
  1112.     cy+=bl; ma+=bl; ye+=bl; bl=cy*0.3+ma*0.59+ye*0.11;
  1113.     n = (short)(cy * maxink);  if (n < 0) n = 0;
  1114.     if (n > maxink) n = maxink;  stackcy[colst] = n;
  1115.     n = (short)(ma * maxink);  if (n < 0) n = 0;
  1116.     if (n > maxink) n = maxink;  stackma[colst] = n;
  1117.     n = (short)(ye * maxink);  if (n < 0) n = 0;
  1118.     if (n > maxink) n = maxink;  stackye[colst] = n;
  1119.     n = (short)(bl * maxink);  if (n < 0) n = 0;
  1120.     if (n > maxink) n = maxink;  stackbl[colst] = n;
  1121.   }
  1122.   b = stackbl[colst];  cle = b;
  1123.   n = stackcy[colst];  cle += n;  if (alles == 3) darkfac = n;
  1124.   for (m = 0; m <= 7; m++)
  1125.    greymask[m].maskc = maskb[n][m & 3];
  1126.   n = stackma[colst];  cle += n;  if (alles == 2) darkfac = n;
  1127.   for (m = 0; m <= 7; m++)
  1128.    greymask[m].maskm = maskb[n][m & 3];
  1129.   n = stackye[colst];  cle += n;  if (alles == 1) darkfac = n;
  1130.   for (m = 0; m <= 7; m++)
  1131.    greymask[m].masky = maskb[n][m & 3];
  1132.   clearing = (cle == 0);  if (vertfac == 7)  darkfac = b;
  1133. }
  1134. static void preambl() {  uchar l;
  1135.   l = dvibyte();  num = dvinum(4);  den = dvinum(4);
  1136.   dvimag = dvinum(4);  if (newmag != 0) dvimag = newmag;
  1137.   conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0);
  1138.   vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0);
  1139.   l = dvibyte();  dvibytes(comment, l);  fprintf(prot, "%s\n", comment);
  1140. }
  1141. static void postamb() {
  1142.   lpp = dvinum(4);  num = dvinum(4);  den = dvinum(4);
  1143.   dvimag = dvinum(4);  if (newmag != 0) dvimag = newmag;
  1144.   conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0);
  1145.   vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0);
  1146.   mxv = dvinum(4);  mxh = dvinum(4);  mst = dvinum(2);  mpn = dvinum(2);
  1147.  
  1148. }
  1149.  
  1150. main(int argc, char **argv) { char *parm;
  1151.   post = 0;  fini = 0;  started = 0;  dviori = 0;  pagnum = 0;
  1152.   pag1 = 1;  paganz = 9999;  newmag = 0;  q = 0;  hoff = -xres;  voff = -yres;
  1153.   Tptr( fontvect = (fontdesc **) calloc(256, 4) );
  1154.   initbitrev();  colst = 0;  dispinit();
  1155.   stackcy[colst] = maxink;  stackma[colst] = maxink;
  1156.   stackye[colst] = maxink;  stackbl[colst] = maxink;
  1157.  
  1158.   fprintf(prot, "This is the VGA Color TeX driver, V 94.02 .\n");
  1159.   fprintf(prot, "(C)opyright 1994 Wolfgang R. Mueller, Computing Centre,\n");
  1160.   fprintf(prot, "Heinrich-Heine-University Duesseldorf, Germany\n");
  1161.   if (argc == 1) {
  1162.     fprintf(prot, "Please use with dvifilename and optional parameters\n");
  1163.     fprintf(prot, " -s<starting page>     (default: 1  i.e. first in file)\n");
  1164.     fprintf(prot, " -m<new magnification> (default: from DVIfile)\n");
  1165.     fprintf(prot, " -f<font directory>    (default: %s)\n", fontprefix);
  1166.     fprintf(prot, " -t<TFMfile directory> (default: %s)\n", tfmprefix);
  1167.     exit(0);
  1168.   }
  1169.   strcpy(dviname, "texput");
  1170.   for (j = 1; j < argc; j++) {  parm = argv[j];
  1171.     if (parm[0] != '-') {  strcpy(dviname, parm);
  1172.     } else {  switch (parm[1]) {
  1173.       case 's':  case 'S':  sscanf(parm+2, "%d", &pag1);  break;
  1174.       case 'f':  case 'F':  strcpy(fontprefix, parm+2);  break;
  1175.       case 't':  case 'T':  strcpy(tfmprefix, parm+2);  break;
  1176.       case 'm':  case 'M':  sscanf(parm+2, "%ld", &newmag);  break;
  1177.   } } }
  1178.   dviopen();  postamb();
  1179.   do {  o = dvibyte();  /* fprintf(prot, "(%u)", (ushort)o); */
  1180.     if (o <= 127) {
  1181.       c = o;  if (started) putchar_();  h += q;
  1182.     } else if (o >= 171 && o <= 234) {
  1183.       f = o - 171;  if (started)  fontset();
  1184.     } else  switch (o) {
  1185.     case 128:  case 129:  case 130:  case 131:
  1186.       c = dvinum(o - 127);  if (started) putchar_();  h += q;  break;
  1187.     case 132:  a = dviint(4);  b = dviint(4);
  1188.       if (started) putrule();  h += b;  break;
  1189.     case 133:  case 134:  case 135:  case 136:
  1190.       c = dvinum(o - 132);  if (started) putchar_();  break;
  1191.     case 137:  a = dviint(4);  b = dviint(4);
  1192.       if (started) putrule();  break;
  1193.     case 138:  break;
  1194.     case 139:  pagebeg();  break;
  1195.     case 140:  pageend();  break;
  1196.     case 141:  if (s < smax) {    s++;  hs[s - 1] = h;  vs[s - 1] = v;
  1197.     ws[s - 1] = w;    xs[s - 1] = x;    ys[s - 1] = y; zs[s - 1] = z;
  1198.       } else  baddvi("stack overflow");  break;
  1199.     case 142:  if (s > 0) {  h = hs[s - 1];  v = vs[s - 1];
  1200.     w = ws[s - 1];    x = xs[s - 1];    y = ys[s - 1];    z = zs[s - 1];    s--;
  1201.       } else  baddvi("stack underflow");  break;
  1202.     case 143:  case 144:  case 145:  case 146:
  1203.       h += dviint(o - 142);  break;
  1204.     case 147:  h += w;  break;
  1205.     case 148:  case 149:  case 150:  case 151:
  1206.       w = dviint(o - 147);  h += w;  break;
  1207.     case 152:  h += x;  break;
  1208.     case 153:  case 154:  case 155:  case 156:
  1209.       x = dviint(o - 152);  h += x;  break;
  1210.     case 157:  case 158:  case 159:  case 160:
  1211.       v += dviint(o - 156);  break;    case 161:  v += y;  break;
  1212.     case 162:  case 163:  case 164:  case 165:
  1213.       y = dviint(o - 161);  v += y;  break;
  1214.     case 166:  v += z;  break;
  1215.     case 167:  case 168:  case 169:  case 170:
  1216.       z = dviint(o - 166);  v += z;  break;
  1217.     case 235:  case 236:  case 237:  case 238:
  1218.       f = dvinum(o - 234);  if (started) fontset();  break;
  1219.     case 239:  case 240:  case 241:  case 242:
  1220.       spl = dvinum(o - 238);  special();  break;
  1221.     case 243:  case 244:  case 245:  case 246:
  1222.       f = dvinum(o - 242);  deffont();  break;
  1223.     case 247:  preambl();  break;
  1224.     case 248:  fini = 1;  break;
  1225.     case 249:  dviposit(0L);  post = 1;  break;
  1226.     case 250:  case 251:  case 252:
  1227.     case 253:  case 254:  case 255:  break;
  1228.   } } while (!fini);
  1229.   dispclos(); fclose(dvifile); exit(0);
  1230. }
  1231. static void finale()  {  dispclos();  exit(1);  }
  1232.